/**
 * 给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素。
 * 元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k，要通过此题，您需要执行以下操作：

更改 nums 数组，使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
*/
#if 1
#include <stdio.h>
int removeElement(int *nums, int numsSize, int val)
{
    // int count = 0;
    // for (int i = 0; i < numsSize; i++)
    // {
    //     /* code */
    //     if (nums[i] == val)
    //     {
    //         /* code */
    //         nums[i] = 0;
    //     }
        
    // }
    
    // for (int i = 0; i < numsSize; i++)
    // {
    //     /* code */
    //     if (0 == nums[i])
    //     {
    //         /* code */
    //         for (int j = i; j < numsSize; j++)
    //         {
    //             /* code */
    //             nums[j] = nums[j + 1];
    //         }
    //         count++;

    //     }

    // }
    // if (numsSize == 0)
    // {
    //     return 0;
    // }
    // int fast = 1, slow = 0;
    // while (fast < numsSize)
    // {
    //     if (nums[fast] != nums[fast - 1])
    //     {
    //         nums[slow] = nums[fast];
    //         ++slow;
    //     }
    //     ++fast;
    // }
    // return slow;
    int left = 0;
    for (int right = 0; right < numsSize; right++) {
        if (nums[right] != val) {
            nums[left] = nums[right];
            left++;
        }
    }
    return left;
}
int main()
{
    int nums[] = {3, 2, 2, 3}; // 输入数组
    int val = 3;               // 要移除的值
    // int expectedNums[] = [...]; // 长度正确的预期答案。
    //                             // 它以不等于 val 的值排序。

    int k = removeElement(nums, 4, val); // 调用你的实现

    // sort(nums, 0, k); // 排序 nums 的前 k 个元素
    // for (int i = 0; i < actualLength; i++)
    // {
    //     assert nums[i] == expectedNums[i];
    // }
    printf("数量为：%d\n",k);
    for (int i = 0; i < k; i++)
    {
        /* code */
        printf("%d ",nums[i]);
    }
    
    return 0;
}
#endif